from strategy.StrategyTemplate import StrategyTemplate
from strategy import strategy_filter
from utils.db import DbHandler
from strategy.pro_strategy.pro_strategy_common import minilow_column


class MiniLow(StrategyTemplate):
    """
        小盘低价格转债策略
            小盘指的是剩余市值小(剩余市值=剩余规模*转债价格),价格低是王道,偏防守的策略

        筛选方法:

        1. 排除已经公告强赎的,排除正股st的,远离垃圾股、远离已公告强赎债
        2. 剩余年限大于等于1年,给实施强赎留有充分的时间
        3. 转债价格小于等于130,转债剩余市值小于等于300
        4. 按价格从低到高取前10名
    """
    def __init__(self):
        super(self.__class__, self).__init__()
        self.strategy_name = "启四小盘低价格策略"
        self.strategy_descrption = "按涨幅排序"

    def run(self):
        # 基础过滤，过滤掉新债、强赎、EB
        self.data = strategy_filter.filter_base(self.data)
        self.data = strategy_filter.filter_st_bond(self.data)
        # 到期时间大于一年
        self.data = self.data.loc[self.data['剩余年限'] >= 1.0]
        # 转债价格小于等于130
        self.data = self.data.loc[self.data['现价'] < 130]
        # 剩余市值小于300
        self.data = self.data.loc[self.data['剩余规模']*self.data['现价'] < 300]
        self.data = self.data.loc[self.data['正股名称'].str.contains('ST') != True]
        self.data = self.data.sort_values(by='现价', ascending=True)

        self.data = self.data[['转债名称', '转债代码', '现价', '涨跌幅', '溢价率', '转股价值',
                               '剩余年限', '剩余规模', '行业', '正股波动率', '基金持仓']]

    def api(self, size=10):
        db = DbHandler()
        db.create_session()
        super(self.__class__, self).api(db=db)
        self.data = strategy_filter.filter_st_bond(self.data)
        # 到期时间大于一年
        self.data = self.data.loc[self.data['year_left'] >= 1.0]
        # 转债价格小于等于130
        self.data = self.data.loc[self.data['price'] < 130]
        # 剩余市值小于300
        self.data = self.data.loc[self.data['curr_iss_amt'] * self.data['price'] < 300]
        self.data = self.data.loc[self.data['stock_nm'].str.contains('ST') != True]
        self.data = self.data.sort_values(by='price', ascending=True)
        # 获得默认列
        pd_bond_data = self.data[minilow_column]
        # 清掉原来的索引
        pd_bond_data.reset_index(inplace=True, drop=True)
        self.db.close_session()
        return pd_bond_data


if __name__ == '__main__':
    ins = MiniLow()
    ins.topN = 20
    ins.test()

